package businessLayer;
import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import domain.Studiengang;
/**
 * Implementierung der BusinessLayer Klasse Studiengang, implementiert das Interface BLCRUD fuer Create, Read, Update und Delete Operationen auf einer Aufzaehlung.
 * 
 * @author Kai Gutzeit
 * @version 13.12.2014
 */
public class BLStudiengang implements BL_CRUD<Studiengang>
{
	// Logger der BLStudiengang Klasse.
	private static final Logger logger = LoggerFactory.getLogger(BLStudiengang.class);
    // Instanzvariable welche die Referenz der Geschäftsobjekte in einer Aufzählung beinhaltet.
    private List<Studiengang> studiengaenge;

    /**
     * Konstruktormethode welche die Referenz zu den vorhandene Studiengaengen uebergeben bekommt.
     * 
     * @param  iStudiengaenge Eine Referenz zur Aufzaehlung der verfuegbaeren Studiengaenge.
     */
    public BLStudiengang(List<Studiengang> iStudiengaenge)
    {
        studiengaenge = iStudiengaenge;
    }

    /**
     * Implementierung der Create Methode aus dem Interface BL_CRUD
     * 
     * @param  iBusinessObject Übergibt die Referenz zu einem Studiengang, welche der Referenz der privaten Variable Studiengaengen hinzugefuegt wird.
     * 
     * @return Der erstellte Studiengang mit einer eindeutig erzeugten UUID als ID.
     * 
     * @exception IllegalArgumentException Die zu implementierende Methode kann eine IllegalArgumentException werfen in welcher Detail Information zum Fehlschlagen der Operation enthalten sind.
     */
    public Studiengang Create(Studiengang iBusinessObject) throws IllegalArgumentException{
    	for(Studiengang studiengang : studiengaenge){
    		if(studiengang.getName().equals(iBusinessObject.getName())){
    			throw new IllegalArgumentException("Studiengang " + iBusinessObject.getName() + "already exists!");
    		}
    	}
    	
    	studiengaenge.add(iBusinessObject);
		logger.debug(iBusinessObject.getName() + " mit " + iBusinessObject.getModule().size() + " Modulen (" + iBusinessObject.getModule().toString() + ")" + " erstellt.");

    	return iBusinessObject;
    }
    
     /**
     * Die Read Methode erlaubt es anhand eines eindeutigen Schluessels einen Studiengang aus der Aufzaehlung Studiengaenge zu erhalten. 
     * 
     * @param  id  Es wird eine eindeutige id vom Typ UUID uebergeben um den Studiengang eindeutig identifizierbar zu machen.
     * 
     * @return Das zu lesende Objekt vom Typ Studiengang.
     * 
     * @exception IllegalArgumentException Die zu implementierende Methode kann eine IllegalArgumentException werfen in welcher Detail Information zum fehlschlagen der Operation enthalten sind.
     */
    public Studiengang Read(UUID id) throws Exception{
        return null;
    }
    
     /**
     * Die Update Methode uebermittelt ein komplettes Objekt vom Typ Studiengang und sorgt fuer das Aktualisieren des jeweiligen Objektes in der privaten Aufzaehlung der Studiengaenge.
     * 
     * @param  iBusinessObject Es wird das zu aktualisierende Objekt vom Typ Studiengang uebergeben.
     * 
     * @return Ein boolscher Wert fuer den Erfolg oder Nichterfolg der Update-Operation.
     * 
     * @exception IllegalArgumentException Die zu implementierende Methode kann eine IllegalArgumentException werfen in welcher Detail Information zum Fehlschlagen der Operation enthalten sind.
     */
    public Boolean Update(Studiengang iBusinessObject) throws Exception{
        return null;
    }
    
     /**
     * Die Delete Methode bekommmt eine id als UUID Objekt uebergeben, welches das Objekt vom Typ Studiengang aus einer Aufzaehlung eindeutig identifiziert und anschliessend entfernt.
     * 
     * @param  UUID id Es wird eine eindeutige id vom Typ UUID uebergeben.
     * 
     * @return Ein boolscher Wert fuer den Erfolg oder Nichterfolg der Delete-Operation.
     * 
     * @exception IllegalArgumentException Die zu implementierende Methode kann eine IllegalArgumentException werfen in welcher Detail Information zum Fehlschlagen der Operation enthalten sind.
     */
    public Boolean Delete(UUID id) throws Exception{
        return null;
    }
}
